//
// Created by pzw on 24-1-4.
//

#ifndef THREAD_POOL_H
#define THREAD_POOL_H


#include <vector>
#include <queue>
#include <memory>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <future>
#include <functional>
#include <stdexcept>

/**
 * C++实现线程池
 *
 * 无论什么语言，实现线程池，一般地，都会有以下几个部分构成:
 * 1. 线程池管理器(ThreadPoolManager): 用于创建并管理线程池。
 * 2. 工作线程(WorkThread): 线程池中线程。
 * 3. 任务队列: 用于存放没有处理的任务。提供一种缓冲机制。
 * 4. 用于添加任务的接口。
 */
class ThreadPool final {
public:
    __attribute__((unused)) explicit ThreadPool(size_t);

    ~ThreadPool();

    template<class F, class... Args>
    auto enqueue(F &&f, Args &&... args) -> std::future<typename std::result_of<F(Args...)>::type>;

    template<class F, class... Args>
    std::future<typename std::result_of<F(Args...)>::type> enqueue2(F &&f, Args &&... args);

private:
    /**
     * need to keep track of threads, so we can join them
     */
    std::vector<std::thread> workers;
    /**
     * the task queue
     */
    std::queue<std::function<void()> > tasks;
    /**
     * synchronization
     */
    std::mutex queue_mutex;
    /**
     * 条件变量
     */
    std::condition_variable condition;
    /**
     * 线程池是否已经结束
     */
    bool stop;
};


#endif // THREAD_POOL_H

